#include "ABMConcepto.h"
#include "ui_ABMConcepto.h"

extern QSqlDatabase enjoylifedb;
extern QSqlRelationalTableModel *concepto_model;

// Definición de acceso directo para borrar un registro mediante la tecla "Supr".
QShortcut* shortcutBaja3;

/*
 * Constructor de la la clase concepto.
 */
ABMConcepto::ABMConcepto(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ABMConceptos)
{
    ui->setupUi(this);
    setWindowFlags(Qt::WindowCloseButtonHint);

    concepto_model = new QSqlRelationalTableModel(this,enjoylifedb);
    concepto_model->setTable("concepto");
    concepto_model->setEditStrategy(QSqlRelationalTableModel::OnFieldChange);

    on_add_concepto = false;
    on_edit_concepto = false;
    row_edited = -1;

    ui->label_concepto->setEnabled(false);
    ui->concepto->setEnabled(false);
    ui->tipo_concepto->setChecked(false);
    ui->agregarBtn->setEnabled(true);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->guardarBtn->setEnabled(false);

    SelectConceptos();

    // Definición de acceso directo para guardar cambios.".
    QShortcut* shortcutGuardar = new QShortcut(QKeySequence(Qt::Key_Return), this);
    connect(shortcutGuardar, SIGNAL(activated()), this, SLOT(on_guardarBtn_clicked()));
    // Definición de acceso directo para Cancelar cambios.".
    QShortcut* shortcutCancelar = new QShortcut(QKeySequence(Qt::Key_Escape), this);
    connect(shortcutCancelar, SIGNAL(activated()), this, SLOT(close()));

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    QShortcut* shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), this);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(on_agregarBtn_clicked()));
}

/*
 * Destructor de la la clase concepto.
 */
ABMConcepto::~ABMConcepto()
{
    delete ui;
}

/*
 *
 */
void ABMConcepto::GetConcepto(QString s_concepto)
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);
    QString stm = "select concepto from concepto where concepto = ";
    stm.append("\'");
    stm.append(s_concepto);
    stm.append("\'");

    if (! query->exec(stm)) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, "
                              "intentelo manualmente || " + query->lastError().text());
        return;
    }

    while (query->next()) {
        ui->concepto->setText(s_concepto);
    }

    //    filterConcepto = "concepto = '" + s_concepto + "'";
    //    SelectConceptos();
}

/*
 * Se realiza un select sobre la tabla concepto.
 */
void ABMConcepto::SelectConceptos()
{
    concepto_model->setTable("concepto");
    enjoylifedb.transaction();
    if (!concepto_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewConceptos();
}

void ABMConcepto::CorrectViewConceptos()
{
    concepto_model->setHeaderData(0,Qt::Horizontal,"Nro. Concepto");
    concepto_model->setHeaderData(1,Qt::Horizontal,"Concepto");

    ui->conceptos_view->setModel(concepto_model);
    ui->conceptos_view->setAlternatingRowColors(true);
    ui->conceptos_view->setGridStyle(Qt::SolidLine);
    ui->conceptos_view->sortByColumn(1,Qt::SortOrder());
    ui->conceptos_view->setSortingEnabled(true);
    ui->conceptos_view->horizontalHeader()->setStretchLastSection(true);
    ui->conceptos_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->conceptos_view->setColumnWidth(1, 400);

    ui->conceptos_view->hideColumn(2);
}

/*
 * Acción del botón agregar.
 */
void ABMConcepto::on_agregarBtn_clicked()
{
    if (!ui->concepto->text().isEmpty()) {
        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Alerta!"),
                                       "Actualmente está editando una concepto "
                                       "quiere cancelar la operación e ingresar uno nuevo?",
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            ui->concepto->clear();
            ui->label_concepto->setEnabled(true);
            ui->concepto->setEnabled(true);
            ui->concepto->setFocus();
            on_add_concepto = true;
            on_edit_concepto = false;
            ui->editarBtn->setEnabled(false);
            ui->eliminarBtn->setEnabled(false);
            ui->guardarBtn->setEnabled(true);
            return;
        }
    }
    else {
        ui->concepto->clear();
        ui->label_concepto->setEnabled(true);
        ui->concepto->setEnabled(true);
        ui->concepto->setFocus();
        on_add_concepto = true;
        on_edit_concepto = false;
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->guardarBtn->setEnabled(true);
    }
}

/*
 * Acción del botón guardar.
 */
void ABMConcepto::on_guardarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar concepto"),
                                   "¿Está seguro que quiere "
                                   "guardar la concepto " + ui->concepto->text() + "?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        // Se seleccionó la opción de agregar un nuevo concepto.
        if (on_add_concepto) {
            if (ui->concepto->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar concepto",
                                      "Advertencia! Debe ingresar un valor para concepto");
                return;
            }

            // Se decide guardar el concepto
            QSqlRecord record;

            // Se agrega el concepto
            QSqlField pField(QStringLiteral("concepto"), QVariant::String);
            pField.setValue(ui->concepto->text());
            record.append(pField);
            // Se agrega el tipo de concepto
            QSqlField tipoCField(QStringLiteral("tipo_concepto"), QVariant::String);
            if (ui->c_cliente->isChecked()) {
                tipoCField.setValue("Cliente");
            } else {
                if (ui->c_interno->isChecked()) {
                    tipoCField.setValue("Interno");
                } else {
                    QMessageBox::information(this,"AVISO!", "Tiene que seleccionar un tipo de concepto.");
                    return;
                }
            }
            record.append(tipoCField);

            enjoylifedb.transaction();
            if (!(concepto_model->insertRecord(-1, record))) {
                QString error = concepto_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo insertar el concepto, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();

            SelectConceptos();
        }

        // El usuario hizo click sobre el boton editar.
        if (on_edit_concepto) {
            QString filter = "id_concepto = '" + idConcepto + "'";
            concepto_model->setFilter(filter);
            enjoylifedb.transaction();
            if (!(concepto_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            if (concepto_model->rowCount() == 1) {
                QSqlRecord record = concepto_model->record(0);

                if (ui->concepto->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar concepto",
                                          "Advertencia! Debe ingresar un valor para el concepto");
                    return;
                }

                // Se agrega el concepto
                record.setValue("concepto", ui->concepto->text());
                // Se agrega el tipo de concepto
                if (ui->c_cliente->isChecked()) {
                    record.setValue("tipo_concepto", "Cliente");
                } else {
                    if (ui->c_interno->isChecked()) {
                        record.setValue("tipo_concepto", "Interno");
                    } else {
                        QMessageBox::information(this,"AVISO!", "Tiene que seleccionar un tipo de concepto.");
                        return;
                    }
                }

                concepto_model->setRecord(0, record);
                enjoylifedb.transaction();
                if (!concepto_model->submitAll()) {
                    QString error = concepto_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }

            SelectConceptos();
        }
        row_edited = -1;
        on_add_concepto = false;
        on_edit_concepto = false;
        ui->agregarBtn->setEnabled(true);
        ui->editarBtn->setEnabled(false);
        ui->eliminarBtn->setEnabled(false);
        ui->guardarBtn->setEnabled(false);
        ui->concepto->clear();
        ui->label_concepto->setEnabled(false);
        ui->concepto->setEnabled(false);
        ui->tipo_concepto->setChecked(false);
    }
    else
        return;
}

/*
 * Acción del botón eliminar.
 */
void ABMConcepto::on_eliminarBtn_clicked()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Eleminar concepto"),
                                   "¿Está seguro que quiere "
                                   "eliminar el concepto '" + ui->concepto->text() + "'?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        enjoylifedb.transaction();
        if (!concepto_model->removeRow(ui->conceptos_view->currentIndex().row())) {
            QMessageBox::critical(this,"Error!", "No se pudo eliminar el concepto, vuelva a intentarlo.");
            enjoylifedb.rollback();
            return;
        }
        QMessageBox::information(this,"Exito!", "El concepto fue eliminado correctamente.",
                                 QMessageBox::Ok);

        concepto_model->submitAll();
        enjoylifedb.commit();
    }
    row_edited = -1;
    on_add_concepto = false;
    on_edit_concepto = false;
    ui->agregarBtn->setEnabled(true);
    ui->editarBtn->setEnabled(false);
    ui->eliminarBtn->setEnabled(false);
    ui->guardarBtn->setEnabled(false);
    ui->concepto->clear();
    ui->label_concepto->setEnabled(false);
    ui->concepto->setEnabled(false);
    ui->tipo_concepto->setChecked(false);
}

/*
 * Acción al hacer click sobre un concepto.
 */
void ABMConcepto::on_conceptos_view_clicked(const QModelIndex &index)
{
    if (index.row() != -1) {
//        ui->agregarBtn->setEnabled(false);
        ui->editarBtn->setEnabled(true);
        ui->eliminarBtn->setEnabled(true);
        ui->guardarBtn->setEnabled(true);
        idConcepto = concepto_model->index(index.row(),0).data().toString();
        ui->concepto->setText(concepto_model->index(index.row(),1).data().toString());
        if (concepto_model->index(index.row(),2).data().toString() == "Cliente") {
            ui->c_cliente->setChecked(true);
            ui->c_interno->setChecked(false);
        }
        if (concepto_model->index(index.row(),2).data().toString() == "Interno") {
            ui->c_cliente->setChecked(false);
            ui->c_interno->setChecked(true);
        }
        ui->label_concepto->setEnabled(false);
        ui->concepto->setEnabled(false);
        ui->tipo_concepto->setChecked(false);

        // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
        shortcutBaja3 = new QShortcut(QKeySequence(QKeySequence::Delete), ui->conceptos_view);
        connect(shortcutBaja3, SIGNAL(activated()), this, SLOT(on_eliminarBtn_clicked()));
        // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
        QShortcut* shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), ui->conceptos_view);
        connect(shortcutModif, SIGNAL(activated()), this, SLOT(on_editarBtn_clicked()));
    }
}

/*
 * Acción del botón editar.
 */
void ABMConcepto::on_editarBtn_clicked()
{
    ui->label_concepto->setEnabled(true);
    ui->concepto->setEnabled(true);
    ui->guardarBtn->setEnabled(true);
    ui->concepto->setFocus();
    on_edit_concepto = true;
    on_add_concepto = false;
    row_edited = ui->conceptos_view->currentIndex().row();
}

/*
 * Acción del botón cerrar.
 */
void ABMConcepto::on_cerrarBtn_clicked()
{
    close();
}

